# @Time : 2020/7/30 13:50
# @Author : Fioman 
# @Phone : 13149920693
import cv2 as cv
import numpy as np

"""
形状匹配:
我们通过Hu矩来判断两个对象的一致性.例如,上一节计算两个对象Hu矩的差,但是结果比较抽象.为了更加直观方便地比较Hu矩值,Opencv
提供了函数cv2.matchShapes(),对两个对象的Hu矩进行比较.
函数cv.matchShapes() 允许我们提供两个对象,对二者的Hu矩进行比较.这两个对象可以是轮廓,也可以是灰度图.不管是什么,
cv.matchShapes()都会提前计算好对象的Hu矩值.
函数cv.matchShapes()的语法格式是:
retval = cv.matchShapes(contour1,contour2,method,parameter)
contour1: 第一个轮廓或者灰度图像
contour2: 第二个轮廓或者灰度图像
method: 比较两个对象的Hu矩的方法.
"""
img1 = cv.imread("cs1.bmp")
img2 = cv.imread("cs2.bmp")
img3 = cv.imread("cs3.bmp")


gray1 = cv.cvtColor(img1,cv.COLOR_BGR2GRAY)
gray2 = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
gray3 = cv.cvtColor(img3,cv.COLOR_BGR2GRAY)

T1,thres1 = cv.threshold(gray1,127, 255,cv.THRESH_BINARY)
T2,thres2 = cv.threshold(gray2,127,255,cv.THRESH_BINARY)
T3,thres3 = cv.threshold(gray3,127,255,cv.THRESH_BINARY)

image1,contours1,hierechy1 = cv.findContours(thres1,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
image2,contours2,hierechy2 = cv.findContours(thres2,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
image3,contours3,hierechy3 = cv.findContours(thres3,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)
cnt1,cnt2,cnt3 = contours1[0],contours2[0],contours3[0]

ret0 = cv.matchShapes(cnt1,cnt1,1,0.0)
ret1 = cv.matchShapes(cnt1,cnt2,1,0.0)
ret2 = cv.matchShapes(cnt1,cnt3,1,0.0)

print("相同图像的matchShape = {}".format(ret0))
print("相似图像的matchShape = {}".format(ret1))
print("不相似图像的matchShape = {}".format(ret2))












